


/**
 * 解密加密数据
 * @param {string} data - 经过 Base58 编码的加密数据
 * @param {string} nonce - 经过 Base58 编码的随机数（用于解密）
 * @param {Uint8Array} sharedSecret - 共享密钥（由本地私钥和对方公钥生成）
 * @returns {Object} - 解密后的 JSON 数据
 * @throws {Error} - 如果共享密钥缺失或解密失败，则抛出错误
 */
const decryptPayload = (data, nonce, sharedSecret) => {
    if (!sharedSecret) throw new Error("missing shared secret");
    // 解码 Base58 编码的数据和随机数

    const decryptedData = nacl.box.open.after(bs58.decode(data), bs58.decode(nonce), sharedSecret);
    if (!decryptedData) {
        throw new Error("Unable to decrypt data");
    }
    // 将解密后的二进制数据转换为字符串，并解析为 JSON 对象

    return JSON.parse(Buffer.from(decryptedData).toString("utf8"));
};
/**
 * 加密数据
 * @param {Object} payload - 需要加密的 JSON 对象
 * @param {Uint8Array} sharedSecret - 共享密钥（由本地私钥和对方公钥生成）
 * @returns {[Uint8Array, Uint8Array]} - 返回随机数（nonce）和加密后的数据
 * @throws {Error} - 如果共享密钥缺失，则抛出错误
 */
const encryptPayload = (payload, sharedSecret) => {
    if (!sharedSecret) throw new Error("missing shared secret");
    // 生成一个 24 字节的随机数（nonce），用于加密
    const nonce = nacl.randomBytes(24);
    // 使用共享密钥加密 JSON 数据

    const encryptedPayload = nacl.box.after(
        Buffer.from(JSON.stringify(payload)),// 转换 JSON 数据为 Buffer
        nonce,// 随机数
        sharedSecret// 共享密钥
    );
    // 返回 nonce 和加密后的数据
    return [nonce, encryptedPayload];
};
exports  decrypt(data, nonce, publicKey, secretKey) {
        // console.log(secretKey, 'secretKey');
        const secretKeyArray = JSON.parse(secretKey);
        const secretKeyBuffer = Buffer.from(Object.values(secretKeyArray));
        const sharedSecretDapp = nacl.box.before(bs58.decode(publicKey), secretKeyBuffer);
        const decryptedData = decryptPayload(data, nonce, sharedSecretDapp);
        const dataRes = {
            decryptedData: decryptedData,
        }
        // console.log(dataRes, "dataRes");
        return dataRes;
}